void main() {
  //dart中没有interface，每一个类都可以当做接口用，因此abstract修饰的抽象类类，既可以是抽象类，也可以做接口用
  //1、抽象类中只有方法声明，没有方法体的方法是抽象方法，任何实例的方法都可以是抽象的，包括getter,setter,操作符或者普通方法，如：AbsClass01
//  AbsClass01 class01 = AbsClass01();//抽象类不能被实例化
  //2、作为抽象类，子类在extends时可以继承父类非私有属性及方法，但是要实现所有抽象方法，构造函数中需要调用抽象类中的构造函数
  SubClass01 subClass01 = SubClass01('harry');
  subClass01.name = 'jack';
  print(subClass01.age);
  //3、作为接口，子类在实现接口时需要实现所有属性及方法，构造函数可以忽略
  SubClass02 subClass02 = SubClass02();
  subClass02.name = 'jack';
  print(subClass02.age);
  //4、如何抉择abstract类是作为接口还是作为抽象类
  //  1:继承的子类都用到了父类的同一个或多个方法或者属性的情况下用作抽象类
  //  2:继承的子类只是把父类作为一个模版和标准的时候需要自己全部实现属性和方法的时候用作接口
}

abstract class AbsClass01 {
  String name;

  AbsClass01(this.name);

  void fooA() {}

  void fooB();

  int get age; //抽象get
}

class SubClass01 extends AbsClass01 {
  SubClass01(String name) : super(name);

  @override
  // TODO: implement age
  int get age => 18;

  @override
  void fooB() {
    // TODO: implement fooB
  }
}

class SubClass02 implements AbsClass01 {
  @override
  String name;

  @override
  // TODO: implement age
  int get age => 20;

  @override
  void fooA() {
    // TODO: implement fooA
  }

  @override
  void fooB() {
    // TODO: implement fooB
  }
}
